Software redesign is the process of designing and implementing a new overall structure of a software system, without changing its external behavior. The changes aim to fix deficiencies in the software design and create structure that allow for incorporating future enhancements and greater flexibility. The process of redesigning a software systems may result in a modified static structure and dynamic behavior.
With the use of object oriented programming languages, such as Java and C++, software architecture has become an important issue. Software systems often suffer during software evolution due to quick and dirty implementations of new features, which leads to degeneration. Redesign addresses this issue and restores the software design to decrease the maintenance costs.
The term redesign is often used along with the terms refactoring and reengineering. The relationships of these terms can be clarified by defining a hierarchy. Reengineering is the general term for conducting major changes of a software system. It does not specify the software aspects that are changed. Redesign stands for creating a new software design for an existing software system, and may include requirements analysis activities. The new design may then be implemented by refactoring the pre-existing software, or may require a new programming paradigm, such as a transition from unstructured to structured programming or to Object-oriented programming. Changes to the implementation due to a new Programming paradigm are usually too extensive to be described as Refactoring. Code refactoring is making a change to the software implementation in a way that thoroughly maintains internal consistency. Refactoring carries out modifications as a series of small steps. Each of these transformations is called refactoring, and if done correctly will introduce no change to the behavior of the system.[1]